Skip to content

Always use interior nodeId for app mode#9669

Merged
DrJKL merged 3 commits intomainfrom
austin/fix-app-subgraph
Mar 9, 2026
Merged

Always use interior nodeId for app mode#9669
DrJKL merged 3 commits intomainfrom
austin/fix-app-subgraph

Conversation

@AustinMroz
Copy link
Collaborator

@AustinMroz AustinMroz commented Mar 9, 2026

App mode stores the state of selected widgets as a tuple of [NodeId, WidgetName]. With recent subgraph changes, for a given node, widget.name will no longer uniquely resolve to a single widget.

  • From both Vue and Litegraph, selecting an input for display in App mode will now resolve the NodeId of the node which owns the widget instead of the selected node.
  • When displaying selections in litegraph, if the NodeId does not exist in the current graph, instead of resolving the actual node the rootGraph is searched for any subgraphNode which contains a view matching the [NodeId, WidgetName] pair.
  • When displaying widgets in App mode, the widget is always set as being a view of the real widget (This means that they will not display a purple promotion border.

Known Issue:

  • These same subgraph changes made it so that a widget can be linked without being disabled. This PR makes it so widgets which have been linked instead display normally under the assumption that they are incorrectly marked as disabled. As disabled widgets can not be selected as inputs, this should handle normal usage fine, but a better solution is being investigated

┆Issue is synchronized with this Notion page by Unito

@AustinMroz AustinMroz requested a review from a team as a code owner March 9, 2026 17:27
@dosubot dosubot bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Mar 9, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 9, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4eabcf14-f2ed-4a4d-935a-289f1df696d9

📥 Commits

Reviewing files that changed from the base of the PR and between 77d49a6 and 9f9c154.

📒 Files selected for processing (1)
  • src/components/builder/AppBuilder.vue

📝 Walkthrough

Walkthrough

Refactors widget resolution in AppBuilder by adding a resolveNodeWidget helper to locate nodes and optionally promoted widgets within subgraphs, updates selection and bounding logic to use its results, and changes LinearControls to always clear widget slotMetadata and set widget nodeId.

Changes

Cohort / File(s) Summary
Widget Resolution Refactor
src/components/builder/AppBuilder.vue
Added isPromotedWidgetView import and new resolveNodeWidget helper that returns [node, widget] / [node] / [] to support promoted widgets in subgraphs. Replaced direct resolveNode/widget lookups in arrangeInputs, inputsWithState, getBounding, and handleClick. Updated handleClick to derive storeId/storeName from promoted widget sources or node id/name and to update selectedInputs using those keys.
Widget Metadata Handling
src/renderer/extensions/linearMode/LinearControls.vue
Changed nodeToNodeData to iterate all widgets, clear slotMetadata unconditionally, and assign nodeId = String(node.id) to each widget; removed prior filtering that dropped widgets with slotMetadata.linked.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 With twitching feet and code so neat,
I hopped through nodes and found their beat.
Promoted widgets danced in line,
IDs set clear — the graph's design.
A carrot cheer for builds that shine! 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The description covers the main issue and changes but is missing several required template sections like structured 'What' under Changes and Review Focus. Restructure the description to follow the template: add a concise Summary section, organize Changes with clear 'What' and 'Breaking' subsections, and add a Review Focus section highlighting critical design decisions.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title directly reflects the main objective: changing app mode to use interior nodeId for widget selection and display.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch austin/fix-app-subgraph

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Mar 9, 2026

🎭 Playwright: ✅ 560 passed, 0 failed

📊 Browser Reports
  • chromium: View Report (✅ 547 / ❌ 0 / ⚠️ 0 / ⏭️ 10)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 10 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@github-actions
Copy link

github-actions bot commented Mar 9, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/09/2026, 06:20:42 PM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 9, 2026

📦 Bundle: 4.57 MB gzip 🔴 +115 B

Details

Summary

  • Raw size: 21.4 MB baseline 21.4 MB — 🔴 +568 B
  • Gzip: 4.57 MB baseline 4.57 MB — 🔴 +115 B
  • Brotli: 3.53 MB baseline 3.53 MB — 🔴 +232 B
  • Bundles: 232 current • 232 baseline • 2 added / 2 removed

Category Glance
Graph Workspace 🔴 +568 B (967 kB) · Vendor & Third-Party ⚪ 0 B (8.88 MB) · Other ⚪ 0 B (8.04 MB) · Data & Services ⚪ 0 B (2.77 MB) · Panels & Settings ⚪ 0 B (436 kB) · Editors & Dialogs ⚪ 0 B (77.5 kB) · + 5 more

App Entry Points — 28.9 kB (baseline 28.9 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BZuM4kmi.js (removed) 28.9 kB 🟢 -28.9 kB 🟢 -11.4 kB 🟢 -9.35 kB
assets/index-ClrM1RrP.js (new) 28.9 kB 🔴 +28.9 kB 🔴 +11.4 kB 🔴 +9.36 kB

Status: 1 added / 1 removed

Graph Workspace — 967 kB (baseline 967 kB) • 🔴 +568 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-DIslSjz8.js (new) 967 kB 🔴 +967 kB 🔴 +204 kB 🔴 +154 kB
assets/GraphView-Bbgw1WSP.js (removed) 967 kB 🟢 -967 kB 🟢 -204 kB 🟢 -154 kB

Status: 1 added / 1 removed

Views & Navigation — 72.4 kB (baseline 72.4 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudAuthTimeoutView-DwuMBKoC.js 4.96 kB 4.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudForgotPasswordView-BW7NaysW.js 5.59 kB 5.59 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLayoutView-B6dqSjLo.js 6.47 kB 6.47 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLoginView-gyz-i8vd.js 11.5 kB 11.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSignupView-DYXTtwzg.js 9.41 kB 9.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSorryContactSupportView-Deer4x8G.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSubscriptionRedirectView-C-ZS-WK8.js 4.78 kB 4.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSurveyView-BsxwdU-8.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-BEfSPHAy.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserCheckView-BjsTCuv5.js 8.42 kB 8.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserSelectView-BEkAc4PT.js 4.5 kB 4.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Panels & Settings — 436 kB (baseline 436 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AboutPanel-9gZ4G8k8.js 9.79 kB 9.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudRemoteConfig-DuQ59qp9.js 1.48 kB 1.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/config-DrIhAAj_.js 1.22 kB 1.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ExtensionPanel-qLd3etNL.js 9.42 kB 9.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/KeybindingPanel-C8NVrkLe.js 12.3 kB 12.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LegacyCreditsPanel-qSlvFDa3.js 20.7 kB 20.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/refreshRemoteConfig-_dHSwkoL.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SecretsPanel-wnZ7Icmc.js 21.5 kB 21.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ServerConfigPanel-DrxjlKCg.js 6.49 kB 6.49 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BH2NzvA8.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BlDXFCUy.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BPjNSOku.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BSfPhDgX.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CTDqwZOP.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CY1qXPWG.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D4yKfrVw.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DKN0RxMZ.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-hSQJdwwK.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-rqXXfmcr.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-So53ZGaK.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanel-CzLGmztC.js 18.7 kB 18.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserPanel-aV68scmc.js 6.2 kB 6.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
User & Accounts — 16.1 kB (baseline 16.1 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-Blx8G_51.js 3.4 kB 3.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auth-soiHsmTY.js 357 B 357 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/firebaseAuthStore-BnWOHcxV.js 831 B 831 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/PasswordFields-D5kX5MXM.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SignUpForm-DvoZV68B.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UpdatePasswordContent-CoL8Lctp.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-BorJpYlL.js 1.59 kB 1.59 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Editors & Dialogs — 77.5 kB (baseline 77.5 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-COg6fIBU.js 76.8 kB 76.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useSubscriptionDialog-cwZmfzFR.js 779 B 779 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
UI Components — 56.5 kB (baseline 56.5 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Button-C54TnyIk.js 3.2 kB 3.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-BJr1VDd1.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudFeedbackTopbarButton-DlAiduh0.js 1.42 kB 1.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-N4YlkY9b.js 13.8 kB 13.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-PLwEsYtR.js 836 B 836 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-D3QLfJ-O.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-DM6wHLPh.js 5.95 kB 5.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeButton-C8NW9rU_.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/toggle-group-tF66I_um.js 3.83 kB 3.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-B95EAjGD.js 7.39 kB 7.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-xfn08Ppk.js 1.19 kB 1.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useTerminalTabs-BixnsrQA.js 9.87 kB 9.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-CeVzA6qN.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Data & Services — 2.77 MB (baseline 2.77 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/api-D12Dk-RO.js 693 kB 693 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioService-BdPtyrlb.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/bootstrapStore-osgYVfMh.js 2.08 kB 2.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogService-B3Fhv7bk.js 768 B 768 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogService-B79mP_V4.js 1.93 MB 1.93 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/extensionStore-Dk6Gevxm.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/keybindingService-R7QGQ1jG.js 7.16 kB 7.16 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/load3dService-D1llOIVp.js 91.1 kB 91.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-BSjBGkyX.js 7.96 kB 7.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-DquHtX5H.js 803 B 803 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-Ze5zvB9a.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settingStore-BDsPCZey.js 787 B 787 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/userStore-DKq_gmml.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/workflowDraftStore-Bbh2MmU3.js 779 B 779 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/workflowShareService-CwgnQvEu.js 13.3 kB 13.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Utilities & Hooks — 56.8 kB (baseline 56.8 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioUtils-C1C5MPC_.js 858 B 858 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-Bz3E3A2O.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-CC-l-L9z.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DOdPeMQc.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-Cybe2l6l.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/subscriptionCheckoutUtil-BbRZ4EgH.js 2.53 kB 2.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCopyToClipboard-Dhmy-x1U.js 944 B 944 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCurrentUser-B-QWppnU.js 765 B 765 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useErrorHandling-DSsKzl0N.js 1.5 kB 1.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-DZeo_ZWQ.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useFeatureFlags-eP5xLUhv.js 4.86 kB 4.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3d-Bco8x0OB.js 902 B 902 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3d-VvHSNOwM.js 14.6 kB 14.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3dViewer-DkH8oJMf.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3dViewer-Zy4xbkHK.js 881 B 881 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useWorkspaceSwitch-BYT5LVMD.js 688 B 688 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useWorkspaceUI-foaS9psD.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Vendor & Third-Party — 8.88 MB (baseline 8.88 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-D82zUMvC.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DccD0mxo.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-u14f4tgD.js 1.54 MB 1.54 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-prq_Rlnc.js 1.72 MB 1.72 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-DAnHd-7G.js 413 kB 413 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-C69yBO64.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-DTO2QA4Q.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-CmHHRvL9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-CH_Hqnyl.js 124 kB 124 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-Co8jWZ4q.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 8.04 MB (baseline 8.04 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AnimationControls-CYf59ukW.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-KB6aDxFL.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/AudioPreviewPlayer-Clbw5_Og.js 11 kB 11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-DaAGiCO7.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-D2Wl6A4b.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CancelSubscriptionDialogContent-CWoxZkPk.js 4.81 kB 4.81 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/changeTracker-DAZK-rny.js 763 B 763 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudBadges-DxofatxQ.js 1.54 kB 1.54 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudRunButtonWrapper-C8xG_cwX.js 1.72 kB 1.72 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSessionCookie-SFmU9xgA.js 3.14 kB 3.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSubscription-jUyEfm0p.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-BcOH_oP5.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-CVUg6Znj.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-4Ex6JXL0.js 19.2 kB 19.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-4eY_jIIw.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B2u5OAt2.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BAAf-WrY.js 16.4 kB 16.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BwgnbfCS.js 16.5 kB 16.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CMf3AlGU.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Db23kZm5.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DTom9f1s.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-uXFULtu8.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-y391QX3e.js 15.6 kB 15.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-ZTJwiV8a.js 17.3 kB 17.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-ogISyp4e.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/core-DvtCy7nT.js 73.8 kB 73.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CreateWorkspaceDialogContent-5HMjRAy0.js 5.54 kB 5.54 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CurrentUserPopoverWorkspace-DZS2JQnl.js 20.5 kB 20.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/DeleteWorkspaceDialogContent-onfLQ04y.js 4.25 kB 4.25 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/EditWorkspaceDialogContent-TzsEv4SC.js 5.35 kB 5.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FreeTierDialogContent-BYZlcKJy.js 5.42 kB 5.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/GlobalToast-BFFeX5sr.js 2.91 kB 2.91 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/graphHasMissingNodes-CFDXIYjD.js 761 B 761 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/groupNode-NN4RTVyL.js 71.8 kB 71.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-BNlrEPku.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-Dfk52C9I.js 545 kB 545 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/InviteMemberDialogContent-9pX_fNa1.js 7.37 kB 7.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/InviteMemberUpsellDialogContent-Q3FKhbpJ.js 3.86 kB 3.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LeaveWorkspaceDialogContent-D0zJfXZX.js 4.08 kB 4.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/load3d-a1WBvIHH.js 14.8 kB 14.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-DFrsyseu.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-e8czhkIC.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3DConfiguration-DliGNfaq.js 6.27 kB 6.27 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3DControls-B88ji56f.js 30.9 kB 30.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3dViewerContent-BEDLTbwU.js 1.04 kB 1.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3dViewerContent-yEspyOdo.js 23 kB 23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Loader-cdpDz0uu.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-4PccOdiO.js 199 kB 199 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-A9K8E17X.js 140 kB 140 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BERG8Y4E.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bo_nk-LH.js 167 kB 167 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BODcCr1I.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C9ucaZMP.js 158 kB 158 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CM3j3xAc.js 164 kB 164 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-cwloH2g5.js 139 kB 139 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CZ_ZoKrz.js 190 kB 190 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-De96SAcR.js 222 kB 222 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-KB02fdvg.js 159 kB 159 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-CIss1NZp.js 1.83 kB 1.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-CcX--__P.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-imvNSlox.js 1.81 kB 1.81 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-FC1oe-E1.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-quKrqFV_.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-L08_iM14.js 2.78 kB 2.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nightlyBadges-Dk55b0Vc.js 1.04 kB 1.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B8HFl03z.js 406 kB 406 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bhwr0_qt.js 452 kB 452 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BnwYZsRe.js 494 kB 494 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BQQ7epXP.js 394 kB 394 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C4H2Yzrv.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Ci3336-6.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CVMvffJd.js 453 kB 453 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Cxe4eF5X.js 402 kB 402 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D3rH0GXo.js 418 kB 418 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-LI1J_566.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ZRmGudls.js 402 kB 402 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeTemplates-DZBOMBb7.js 9.34 kB 9.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/onboardingCloudRoutes-CjTj_KuW.js 5.51 kB 5.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-VXP92-HL.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Preview3d-C4bo08Hw.js 4.89 kB 4.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-sM4hIL6e.js 1.39 kB 1.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/RemoveMemberDialogContent-CWDMq57z.js 4.06 kB 4.06 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/RevokeInviteDialogContent-B036rWj0.js 3.97 kB 3.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/saveMesh-D4bY3fNl.js 3.42 kB 3.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-BR6SEI0c.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SignInContent-BFu3XHHs.js 18.9 kB 18.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-yLg8Ua1p.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-DXTiDs1x.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-BwR6vNpJ.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeToRun-g6QVnWrN.js 2.06 kB 2.06 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-J8f-bQt0.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanelContentWorkspace-CAuKli_K.js 963 B 963 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanelContentWorkspace-G3B1Guym.js 22 kB 22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionRequiredDialogContent-DyqpwE7N.js 25.6 kB 25.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionRequiredDialogContentWorkspace-CGs6ZCo9.js 46.2 kB 46.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Textarea-tnAz8KeU.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tierBenefits-CsSRm0ei.js 3.66 kB 3.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ValueControlPopover-CN6IsvLb.js 4.93 kB 4.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-BUItZo5F.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DIRwAHBY.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-B_AOifbD.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-CMrmV2Za.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-DLkq0NID.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-L4hCPhOA.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-BZyvlEbQ.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-CyRqphmc.js 3.6 kB 3.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-Dqesk5zj.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCrop-CAloKhIO.js 22.2 kB 22.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputNumber-DuPOPqcI.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-D0ea31DA.js 2.89 kB 2.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-Dq9_JfRn.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLegacy-CDSjTuWf.js 787 B 787 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-BUuB6s0W.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetPainter-DSOJoPxR.js 32.9 kB 32.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-tYaGazrB.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetRecordAudio-D_GSjJDI.js 17.4 kB 17.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetSelect-p9H5EU8e.js 58.3 kB 58.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-DEIU0xzk.js 4.26 kB 4.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-DKi1iU_7.js 3.54 kB 3.54 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DYLaC2lj.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetWithControl-D6bXm4gI.js 4.17 kB 4.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspacePanelContent-Di2H5WfX.js 29.3 kB 29.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

@github-actions
Copy link

github-actions bot commented Mar 9, 2026

⚡ Performance Report

ℹ️ Collecting baseline variance data (0/5 runs). Significance will appear after 2 main branch runs.

Metric Baseline PR Δ
canvas-idle: style recalcs 124 123 -1%
canvas-idle: layouts 0 0 +0%
canvas-idle: task duration 406ms 427ms +5%
canvas-mouse-sweep: style recalcs 171 168 -2%
canvas-mouse-sweep: layouts 12 12 -3%
canvas-mouse-sweep: task duration 886ms 846ms -5%
dom-widget-clipping: style recalcs 43 42 -3%
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 365ms 370ms +1%
subgraph-dom-widget-clipping: style recalcs 73 75 +3%
subgraph-dom-widget-clipping: layouts 0 1
subgraph-dom-widget-clipping: task duration 404ms 434ms +7%
subgraph-idle: style recalcs 121 122 +1%
subgraph-idle: layouts 0 0
subgraph-idle: task duration 380ms 411ms +8%
subgraph-mouse-sweep: style recalcs 161 161 -0%
subgraph-mouse-sweep: layouts 16 16 +2%
subgraph-mouse-sweep: task duration 814ms 819ms +1%
Raw data
{
  "timestamp": "2026-03-09T18:24:01.443Z",
  "gitSha": "c13c63a66649bee6db1d11f53c2844b0a3895683",
  "branch": "austin/fix-app-subgraph",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2005.941000000007,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 22.708,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 429.44599999999997,
      "heapDeltaBytes": -3188532
    },
    {
      "name": "canvas-idle",
      "durationMs": 2028.948000000014,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 24.191000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 420.4080000000001,
      "heapDeltaBytes": -3532572
    },
    {
      "name": "canvas-idle",
      "durationMs": 2046.1700000000178,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 23.767999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 432.2010000000001,
      "heapDeltaBytes": -3702980
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1818.2429999999954,
      "styleRecalcs": 164,
      "styleRecalcDurationMs": 45.169000000000004,
      "layouts": 12,
      "layoutDurationMs": 2.9290000000000003,
      "taskDurationMs": 847.039,
      "heapDeltaBytes": -3487684
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1850.0329999999963,
      "styleRecalcs": 168,
      "styleRecalcDurationMs": 51.083,
      "layouts": 12,
      "layoutDurationMs": 3.281,
      "taskDurationMs": 845.699,
      "heapDeltaBytes": -4308952
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1875.3080000000182,
      "styleRecalcs": 172,
      "styleRecalcDurationMs": 53.634,
      "layouts": 12,
      "layoutDurationMs": 4.069,
      "taskDurationMs": 844.6039999999999,
      "heapDeltaBytes": -2943664
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 630.642000000023,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 14.74,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 408.2250000000001,
      "heapDeltaBytes": 7713068
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 548.1580000000008,
      "styleRecalcs": 40,
      "styleRecalcDurationMs": 12.777,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 349.237,
      "heapDeltaBytes": 7177508
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 558.4810000000289,
      "styleRecalcs": 40,
      "styleRecalcDurationMs": 13.800999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 351.627,
      "heapDeltaBytes": 7481008
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 633.3970000000022,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 20.749999999999996,
      "layouts": 1,
      "layoutDurationMs": 0.1830000000000001,
      "taskDurationMs": 458.4719999999999,
      "heapDeltaBytes": 15878184
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 594.7990000000232,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 19.86,
      "layouts": 1,
      "layoutDurationMs": 0.223,
      "taskDurationMs": 433.9479999999999,
      "heapDeltaBytes": -8222780
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 586.638999999991,
      "styleRecalcs": 72,
      "styleRecalcDurationMs": 15.071,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 410.07000000000005,
      "heapDeltaBytes": -8906824
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2025.97099999997,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 25.826999999999995,
      "layouts": 1,
      "layoutDurationMs": 0.2319999999999999,
      "taskDurationMs": 413.548,
      "heapDeltaBytes": -3043612
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2005.2249999999958,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 22.932000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 408.184,
      "heapDeltaBytes": -3390704
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1996.234999999956,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 23.418999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 410.09,
      "heapDeltaBytes": -3679628
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1968.2849999999803,
      "styleRecalcs": 171,
      "styleRecalcDurationMs": 54.951,
      "layouts": 16,
      "layoutDurationMs": 4.6739999999999995,
      "taskDurationMs": 958.324,
      "heapDeltaBytes": -5134036
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1678.3169999999927,
      "styleRecalcs": 153,
      "styleRecalcDurationMs": 45.442,
      "layouts": 16,
      "layoutDurationMs": 3.9710000000000005,
      "taskDurationMs": 739.8710000000001,
      "heapDeltaBytes": -6638692
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1727.5530000000003,
      "styleRecalcs": 158,
      "styleRecalcDurationMs": 49.828,
      "layouts": 17,
      "layoutDurationMs": 4.430999999999999,
      "taskDurationMs": 758.629,
      "heapDeltaBytes": -5397188
    }
  ]
}

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/builder/AppBuilder.vue`:
- Around line 107-130: The selection lookup fails for promoted widgets because
handleClick stores the promoted widget's display name instead of its interior
source name, so update handleClick to detect promoted widgets (use
isPromotedWidgetView/PromotedWidgetView) and store the source identifiers: when
isPromotedWidgetView(widget) push [widget.sourceNodeId, widget.sourceWidgetName]
into appModeStore.selectedInputs (and use those values when checking existence),
otherwise continue storing [node.id, widget.name]; this will make
resolveNodeWidget (which compares w.sourceWidgetName and w.sourceNodeId)
correctly find promoted selections.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e634565d-7e0f-4618-9feb-305d9ef97464

📥 Commits

Reviewing files that changed from the base of the PR and between 24ac638 and 77d49a6.

📒 Files selected for processing (2)
  • src/components/builder/AppBuilder.vue
  • src/renderer/extensions/linearMode/LinearControls.vue

for (const widget of nodeData.widgets ?? []) widget.slotMetadata = undefined
for (const widget of nodeData.widgets ?? []) {
widget.slotMetadata = undefined
widget.nodeId = String(node.id)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you might want to use widget.setNodeId to keep the store registration updated.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's already updated by virtue of being called through extractVueNodeData? At the very least, widget here doesn't have a setNodeId to call 🤔

DrJKL
DrJKL previously approved these changes Mar 9, 2026
@DrJKL DrJKL assigned AustinMroz and unassigned DrJKL Mar 9, 2026
@DrJKL DrJKL merged commit 7f0472f into main Mar 9, 2026
31 checks passed
@DrJKL DrJKL deleted the austin/fix-app-subgraph branch March 9, 2026 18:36
@AustinMroz AustinMroz added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch core/1.41 Backport PRs for core 1.41 cloud/1.41 Backport PRs for cloud 1.41 labels Mar 9, 2026
github-actions bot pushed a commit that referenced this pull request Mar 9, 2026
App mode stores the state of selected widgets as a tuple of `[NodeId,
WidgetName]`. With recent subgraph changes, for a given node,
`widget.name` will no longer uniquely resolve to a single widget.

- From both Vue and Litegraph, selecting an input for display in App
mode will now resolve the NodeId of the node which owns the widget
instead of the selected node.
- When displaying selections in litegraph, if the NodeId does not exist
in the current graph, instead of resolving the actual node the rootGraph
is searched for any subgraphNode which contains a view matching the
`[NodeId, WidgetName]` pair.
- When displaying widgets in App mode, the widget is always set as being
a view of the real widget (This means that they will not display a
purple promotion border.

Known Issue:
- These same subgraph changes made it so that a widget can be linked
without being disabled. This PR makes it so widgets which have been
linked instead display normally under the assumption that they are
incorrectly marked as disabled. As disabled widgets can not be selected
as inputs, this should handle normal usage fine, but a better solution
is being investigated

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9669-Always-use-interior-nodeId-for-app-mode-31e6d73d365081f8a918d0e43cb659ee)
by [Unito](https://www.unito.io)
github-actions bot pushed a commit that referenced this pull request Mar 9, 2026
App mode stores the state of selected widgets as a tuple of `[NodeId,
WidgetName]`. With recent subgraph changes, for a given node,
`widget.name` will no longer uniquely resolve to a single widget.

- From both Vue and Litegraph, selecting an input for display in App
mode will now resolve the NodeId of the node which owns the widget
instead of the selected node.
- When displaying selections in litegraph, if the NodeId does not exist
in the current graph, instead of resolving the actual node the rootGraph
is searched for any subgraphNode which contains a view matching the
`[NodeId, WidgetName]` pair.
- When displaying widgets in App mode, the widget is always set as being
a view of the real widget (This means that they will not display a
purple promotion border.

Known Issue:
- These same subgraph changes made it so that a widget can be linked
without being disabled. This PR makes it so widgets which have been
linked instead display normally under the assumption that they are
incorrectly marked as disabled. As disabled widgets can not be selected
as inputs, this should handle normal usage fine, but a better solution
is being investigated

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9669-Always-use-interior-nodeId-for-app-mode-31e6d73d365081f8a918d0e43cb659ee)
by [Unito](https://www.unito.io)
@comfy-pr-bot
Copy link
Member

@AustinMroz Successfully backported to #9674

@comfy-pr-bot
Copy link
Member

@AustinMroz Successfully backported to #9675

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Mar 9, 2026
DrJKL pushed a commit that referenced this pull request Mar 9, 2026
As a temporary fix for widgets being incorrectly hidden, #9669 allowed
all disabled widgets to be displayed.

This PR provides a more robust implementation to derive whether the
widget, as would be displayed from the root graph, is disabled.

Potential regression:
- Drag drop handlers are applied on node, not widgets. A subgraph
containing a "Load Image" node, does not allow dragging and dropping an
image onto the subgraphNode in order to load it. Because app mode
widgets would display from the original owning node prior to this PR,
these drag/drop handlers would apply. Placing "Load Image" nodes. I
believe this change makes behavior more consistent, but it warrants
consideration.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9671-Restore-hiding-of-linked-inputs-in-app-mode-31e6d73d365081688e37fbb931f3af68)
by [Unito](https://www.unito.io)
AustinMroz added a commit that referenced this pull request Mar 9, 2026
Backport of #9669 to `core/1.41`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9674-backport-core-1-41-Always-use-interior-nodeId-for-app-mode-31e6d73d365081e1a227edf172c0b822)
by [Unito](https://www.unito.io)

Co-authored-by: AustinMroz <austin@comfy.org>
AustinMroz added a commit that referenced this pull request Mar 9, 2026
Backport of #9669 to `cloud/1.41`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9675-backport-cloud-1-41-Always-use-interior-nodeId-for-app-mode-31e6d73d365081a8a743c5f23a30a620)
by [Unito](https://www.unito.io)

Co-authored-by: AustinMroz <austin@comfy.org>
github-actions bot pushed a commit that referenced this pull request Mar 9, 2026
As a temporary fix for widgets being incorrectly hidden, #9669 allowed
all disabled widgets to be displayed.

This PR provides a more robust implementation to derive whether the
widget, as would be displayed from the root graph, is disabled.

Potential regression:
- Drag drop handlers are applied on node, not widgets. A subgraph
containing a "Load Image" node, does not allow dragging and dropping an
image onto the subgraphNode in order to load it. Because app mode
widgets would display from the original owning node prior to this PR,
these drag/drop handlers would apply. Placing "Load Image" nodes. I
believe this change makes behavior more consistent, but it warrants
consideration.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9671-Restore-hiding-of-linked-inputs-in-app-mode-31e6d73d365081688e37fbb931f3af68)
by [Unito](https://www.unito.io)
github-actions bot pushed a commit that referenced this pull request Mar 9, 2026
As a temporary fix for widgets being incorrectly hidden, #9669 allowed
all disabled widgets to be displayed.

This PR provides a more robust implementation to derive whether the
widget, as would be displayed from the root graph, is disabled.

Potential regression:
- Drag drop handlers are applied on node, not widgets. A subgraph
containing a "Load Image" node, does not allow dragging and dropping an
image onto the subgraphNode in order to load it. Because app mode
widgets would display from the original owning node prior to this PR,
these drag/drop handlers would apply. Placing "Load Image" nodes. I
believe this change makes behavior more consistent, but it warrants
consideration.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9671-Restore-hiding-of-linked-inputs-in-app-mode-31e6d73d365081688e37fbb931f3af68)
by [Unito](https://www.unito.io)
DrJKL pushed a commit that referenced this pull request Mar 10, 2026
As a temporary fix for widgets being incorrectly hidden, #9669 allowed
all disabled widgets to be displayed.

This PR provides a more robust implementation to derive whether the
widget, as would be displayed from the root graph, is disabled.

Potential regression:
- Drag drop handlers are applied on node, not widgets. A subgraph
containing a "Load Image" node, does not allow dragging and dropping an
image onto the subgraphNode in order to load it. Because app mode
widgets would display from the original owning node prior to this PR,
these drag/drop handlers would apply. Placing "Load Image" nodes. I
believe this change makes behavior more consistent, but it warrants
consideration.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9671-Restore-hiding-of-linked-inputs-in-app-mode-31e6d73d365081688e37fbb931f3af68)
by [Unito](https://www.unito.io)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud/1.41 Backport PRs for cloud 1.41 core/1.41 Backport PRs for core 1.41 size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants